<?php

declare(strict_types=1);

namespace app\controller;

use app\BaseController;
use app\service\SignupService;
use think\Request;
use think\Response;
use think\facade\Session;

/**
 * 用户注册控制器类
 *
 * 处理 HTTP 请求和响应，接收用户输入，调用适当的服务来处理业务逻辑
 * 然后根据服务返回的结果决定如何响应用户
 */
class Signup extends BaseController
{
    /**
     * 注册服务实例
     * @var SignupService
     */
    private SignupService $signupService;

    /**
     * 通过依赖注入初始化注册服务
     *
     * @param SignupService $signupService 由容器注入的用户注册业务逻辑服务实例
     */
    public function __construct(SignupService $signupService)
    {
        $this->signupService = $signupService;
    }

    /**
     * 显示注册页面
     *
     * @return Response
     */
    public function index(): Response
    {
        // 从 Session 取出并立即删除
        $oldInput = Session::pull('old_input');

        return view('auth/signup', [
            'old' => $oldInput,
        ]);
    }

    /**
     * 处理注册请求
     *
     * @param Request $request 当前的 HTTP 请求对象
     * @return Response 重定向响应
     */
    public function register(Request $request): Response
    {
        // 如果不是 POST 请求，则重定向到注册页面
        if (!$request->isPost()) {
            return redirect((string) url('/signup'));
        }

        // 从请求中安全地提取指定字段
        $data = $request->only([
            'username',
            'email',
            'password',
            'captcha',
        ]);

        // 调用注册服务处理业务逻辑
        $result = $this->signupService->register($data);

        Session::pull($result['message']);

        // 检查注册是否成功
        if ($result['success']) {
            Session::delete('old_input');
            Session::set('user_id', $result['data']['user_id'] ?? null);

            return redirect((string) url('/'))->with('message', '注册成功。');
        }

        // Session::set('invalid_fields', $result['invalid_fields'] ?? []);

        return redirect((string) url('/signup'))->with('old_input', $data);;
    }
}
